package tools

import (
	"fmt"
	"math"
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
)

//返回数据结构体
type Result struct {
	Success bool        `json:"success"` //成功true，失败false
	Message string      `json:"message"` //消息
	Data    interface{} `json:"data"`    //数据
}

//返回数据结构体
type ResultPage struct {
	Success  bool        `json:"success"` //成功true，失败false
	Message  string      `json:"message"` //消息
	Data     interface{} `json:"data"`    //数据
	Current  int         `json:"current"`
	PageSize int         `json:"pageSize"`
	Total    int64       `json:"total"`
}

//接口调用成功统一调用
func SuccessResult(c *gin.Context, data interface{}) {
	result := Result{
		Success: true,
		Message: "",
		Data:    data,
	}
	//如果是byte类型，转string
	value, ok := data.([]byte)
	if ok {
		result.Data = string(value)
	}
	c.JSON(http.StatusOK, result)
}

//接口调用成功统一调用
func SuccessPageResult(c *gin.Context, data interface{}, current int, pageSize int, total int64) {
	result := ResultPage{
		Success:  true,
		Message:  "",
		Data:     data,
		Current:  current,
		PageSize: pageSize,
		Total:    total,
	}
	//如果是byte类型，转string
	value, ok := data.([]byte)
	if ok {
		result.Data = string(value)
	}
	c.JSON(http.StatusOK, result)
}

//接口失败统一调用
func FailResult(c *gin.Context, msg string) {
	url := c.Request.RequestURI
	fmt.Printf("接口调用失败,url:%s\n错误信息:%s\n", url, msg)
	result := Result{
		Success: false,
		Message: msg,
		Data:    nil,
	}
	c.JSON(http.StatusOK, result)
}

//切片分页
func SlicePage(page, pageSize, nums int) (sliceStart, sliceEnd int) {
	// 定义page和size的默认值
	if page <= 0 {
		page = 1
	}
	if pageSize <= 0 {
		pageSize = 10
	}
	// 如果pageSize大于num（切片长度）, 那么sliceEnd直接返回num的值
	if pageSize > nums {
		return 0, nums
	}
	// 总页数计算，math.Ceil 返回不小于计算值的最小整数（的浮点值）
	pageCount := int(math.Ceil(float64(nums) / float64(pageSize)))
	if page > pageCount {
		return 0, 0
	}
	sliceStart = (page - 1) * pageSize
	sliceEnd = sliceStart + pageSize
	// 如果页总数比sliceEnd小，那么就把总数赋值给sliceEnd
	if sliceEnd > nums {
		sliceEnd = nums
	}
	return sliceStart, sliceEnd
}

//通过url获得节点名称
func GetNodeNameByUrl(url string) string {
	if url != "" {
		index := strings.Index(url, ":")
		if index > 0 {
			name := url[:index]
			return name
		}
	}
	return ""
}
